/** \file funcoes.hpp
 *  \brief Definição de várias funções gerais, preciso organizar melhor ainda
 *  \author Geraldo Francisco de S. Rebouças | gfs.reboucas@gmail.com
 *  \since 01/12/2012
 *  \version 1.0
 *  \date 02/12/2012
 *  \see . */

// Diretrizes de pré-processamento para compilação condicional. Se matriz.hpp não foi definido, defina matriz.hpp. Isso evita a inserção duplicada de uma biblioteca num mesmo código-fonte.
#ifndef _FUNCOES_HPP
#define _FUNCOES_HPP

#include <cstdlib>
#include <ctime>
#include <fstream>
#include <vector>

#include "vetor.hpp"

/// Resolve uma EDO
void solver(double T0, double TM, vetor X0, double W, double PV, vetor (*F)(double, vetor, double));

/// Resolve a Equação Variacional
void solverVE(double T0, double TM, vetor X0, double W, double PV, vetor (*F1)(double, vetor, double), // Eq. do modelo
                                                                       matriz (*F2)(double, vetor, matriz, double)); // Eq. Variacional

/// Resolve a Equação Variacional extraindo os expoentes de Lyapunov do sistema
void solverLyap(double T0, double TM, vetor X0, double W, double PV, vetor (*F1)(double, vetor, double), // Eq. do modelo
                                                                       matriz (*F2)(double, vetor, matriz, double)); // Eq. Variacional

/// Resolve uma EDO \f$ S \f$ vezes, variando o parâmetro variável de \f$ PI \f$ a \f$ PF \f$
void solverDBF(double T0, double TM, vetor X0, double W, double PI, double PF, int S, vetor (*F)(double, vetor, double));

/// Resolve uma EDO aplicando a técnica de controle de linearização por realimentação (fazer)
void solverFL(const char *OPI, double T0, double TM, vetor X0, double W, double PV, vetor (*F)(double, vetor, double));

/// Resolve uma EDO aplicando o método de controle por modos deslizantes (fazer)
void solverSM(const char* OPI, double T0, double TM, vetor X0, double W, double PV, vetor (*F)(double, vetor, double));

/// Método de Runge-Kutta p/ equações diferenciais ordinárias
void RungeKutta4(double H, double &T, vetor &X, double PV, vetor (*F)(double, vetor, double));

/// Método de Runge-Kutta p/ equação variacional
void RungeKutta4VE(double H, double &T, vetor &X, matriz &M, double PV, vetor (*F1)(double, vetor, double), // Eq. do modelo
                                                                           matriz (*F2)(double, vetor, matriz, double)); // Eq. Variacional

/// Calcula a distância euclidiana entre pontos da seção de Poincaré
void OPI(const char *pc, int k);

/// Imprime na tela o k-ésimo menor elemento do vector A.
void kMenor(vector <double>, vector <double>, vector <double>, int);

/// Protótipo da função que retorna a quantidade de linhas de um arquivo txt.
int qtLin(const char *tmp);

/// Protótipo de função que retorna um número pseudo-aleatório no intervalo (a,b)
double Rand(double a, double b);

/// Passa a segundos emitindo um bipe
void beep(int a);


#endif // _FUNCOES_HPP
